package com.yunhe.authority.repository.base;

import com.yunhe.authority.domain.base.Area;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

/**
 * 地区数据仓库
 * @desc 地区数据仓库定义
 * @author liuronglei
 */
@Repository
public interface AreaRepository extends Neo4jRepository<Area, Long> {
    /**
     * 根据地区编号获得地区对象
     * @param name 地区编号
     */
    Area findByName(String name);

    /**
     * 根据地区标题获得地区对象
     * @param title 地区标题
     */
    Area findByTitle(String title);

    /**
     * 根据地区代码获得地区对象
     * @param code 地区代码
     */
    Area findByCode(Long code);

    /**
     * 获得有单位关联的地区对象
     */
    @Query("match(:Firm)-[:AREA_OF]->(n:Area) return n")
    Iterable<Area> findFirmAreas();

    /**
     * 根据单位代码获得单位关联的地区对象
     * @param firmCode 单位代码
     */
    @Query("match(f:Firm)-[:AREA_OF]->(n:Area) where f.code={firmCode} return n")
    Area findFirmArea(@Param("firmCode") Long firmCode);

    /**
     * 根据地区编号删除地区对象
     * @param name 地区编号
     */
    Long deleteByName(String name);

    /**
     * 根据地区代码删除地区对象
     * @param code 地区代码
     */
    Long deleteByCode(Long code);

    /**
     * 根据地区获得所属单位
     * @param  firmId 单位ID
     */
    @Query("start firm=node({firmId}) match(firm)-[:AREA_OF]->(area) return area")
    Iterable<Area> findAreaByFirmId(@Param("firmId") Long firmId);

    @Query("MATCH (n:Area) WHERE not ()-[:HAS_CHILD]->(n) WITH n MATCH p=(n)-[:HAS_CHILD*0..9]->(m) RETURN p")
    Iterable<Area> findAreas();

    @Query("start a=node({id}) match(p:Area)-[r:HAS_CHILD]->(a:Area) delete r")
    void unbindParentAreaById(@Param("id") Long id);

    @Query("start n=node({parentId}),m=node({childId}) create (n)-[:HAS_CHILD]->(m)")
    void bindChildAreaById(@Param("parentId") Long parentId, @Param("childId") Long childId);

    @Query("match(s:Station)-[]->(a:Area) where s.code={stationCode} return a")
    Area findByStationCode(@Param("stationCode") Long stationCode);
}
